home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / Misc_InvokeEditor.c < prev    next >
C/C++ Source or Header  |  1991-06-04  |  2KB  |  99 lines

  1. /* 
  2.  * InvokeEditor.c --
  3.  *
  4.  *    Source for the Misc_InvokeEditor library function.
  5.  *
  6.  * Copyright 1991 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that this copyright
  10.  * notice appears in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/InvokeEditor.c,v 1.2 91/06/03 22:16:16 kupfer Exp $ SPRITE (Berkeley)";
  18. #endif /* not lint */
  19.  
  20. #include <errno.h>
  21. #include <libc.h>
  22. #include <stddef.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <sys/types.h>
  27. #include <sys/wait.h>
  28. #include <unistd.h>
  29.  
  30.  
  31. /*
  32.  *----------------------------------------------------------------------
  33.  *
  34.  * Misc_InvokeEditor --
  35.  *
  36.  *    Invoke the user's editor on the given file.
  37.  *
  38.  * Results:
  39.  *    Returns the exit status from the editor.
  40.  *
  41.  * Side effects:
  42.  *    Typically the user edits the named file.  Of course, once the 
  43.  *    user is in the editor, she can do whatever the editor will let 
  44.  *    her get away with.
  45.  *
  46.  *----------------------------------------------------------------------
  47.  */
  48.  
  49. int
  50. Misc_InvokeEditor(file)
  51.     char *file;            /* name of file to edit */
  52. {
  53.     int pid, w;
  54.     union wait status;
  55.     char *name;            /* simple name of the editor */
  56.     char *editorPath;        /* path to the editor */
  57.     
  58.     editorPath = getenv("EDITOR");
  59.     if (editorPath != NULL ) {
  60.     name = rindex(editorPath, '/');
  61.     if (name != NULL) {
  62.         ++name;
  63.     } else {
  64.         name = editorPath;
  65.     }
  66.     } else {
  67.     name = editorPath = "vi";
  68.     }
  69.  
  70.     pid = vfork();
  71.     if (pid < 0) {
  72.     perror("Can't fork editor");
  73.     return 1;
  74.     } else if (pid == 0) {
  75.     /* 
  76.      * Make sure we don't give the user an editor with a protected 
  77.      * user ID.
  78.      */
  79.     if (getuid() != geteuid()) {
  80.         (void)seteuid(getuid());
  81.     }
  82.     if (getgid() != getegid()) {
  83.         (void)setegid(getgid());
  84.     }
  85.     if (strcmp(name, "mx") == 0) {
  86.         execlp(editorPath, name, "-D", file, NULL);
  87.     } else {
  88.         execlp(editorPath, name, file, NULL);
  89.     }
  90.     (void)fprintf(stderr, "Can't start %s: %s\n", editorPath,
  91.               strerror(errno));
  92.     _exit(127);
  93.     }
  94.     while ((w = wait(&status)) != pid && w != -1) {
  95.     ;
  96.     }
  97.     return(w == -1 || status.w_retcode);
  98. }
  99.